package k_singleton.a_design_pattern.a_thread_unsafe_lazy;

import java.util.Calendar;

/**
 * Created by wug on 2016/7/15 0015.
 */
public class MainTest {
    public static void main(String[] args) throws InterruptedException {
        new MainTest().mainRun();
    }

    public void mainRun() throws InterruptedException {
        /**
         * 解决的问题：使得一个类只能够创建一个对象
         * 查看多线线程例子时先注释该段代码 否则Sigleton会一直使用该实体
         */
        /*
        Singleton instance1 = Singleton.getInstance();
        Singleton instance2 = Singleton.getInstance();

        System.out.println(instance1 == instance2);

        System.out.println("--------------------");
        */

        /**
         * 想象中挺美好的
         * 需要对象时，如果是null 才new一个对象
         * 如果不是null 直接返回
         *
         * 但是如果遇上多线程 立马出错
         *
         * 【线程1】 判断为null 进行new对象的时候 进入等待表示new大对象的概念
         * 【线程2】 因为【线程1】在等待中 此时new的操作还没有完成 那么线程2 new出来的对象就会覆盖之前的那个对象
         *
         */
        Runnable task = new Task();
        for (int i = 0; i < 10; i++) {
            Thread t = new Thread(task, String.valueOf(i));
            t.start();
        }

        /**
         * 顺便说一句 Calendar用的就是单例模式
         */
        Calendar.getInstance();
    }

    public class Task implements Runnable {
        @Override
        public void run() {
            Singleton singleton = Singleton.getInstance();
            System.out.println(singleton + ":" + singleton.hashCode());
        }
    }

    // 参考 http://blog.sina.com.cn/s/blog_6151984a0100kuua.html
}
